/*
 * To change this template, choose Tools | Templates
 * and open the template in the editor.
 */

/*
 * dlgMapaBloqueo.java
 *
 * Created on Nov 15, 2011, 8:00:14 PM
 */

package visual.Configuracion;

import bentity.beAlmacen;
import bentity.beCombo;
import bentity.beCoordenada;
import bentity.beEntrada;
import bentity.beRack;
import bentity.beUbicacion;
import blogic.blAlmacen;
import blogic.blHelper;
import blogic.blRack;
import blogic.blUbicacion;
import java.awt.Color;
import java.awt.Dimension;
import java.awt.Graphics;
import java.awt.Point;
import java.awt.event.WindowEvent;
import java.awt.event.WindowListener;
import java.awt.image.BufferStrategy;
import java.sql.SQLException;
import java.util.ArrayList;
import java.util.logging.Level;
import java.util.logging.Logger;
import javax.swing.DefaultComboBoxModel;
import visual.Seguridad.visualHelper;

/**
 *
 * @author cesar
 */
public class dlgMapaBloqueo extends javax.swing.JDialog {
     private static final int TAM_UNIT = 10;
	    private int racksXCol = 0;
	    private int racksXFila = 0;
	    private int tamRack = 0;
            private boolean esPrimeraVez=false;
            private boolean pintaUbi=false;
            private boolean clickUbi=false;
            private int pisos=0;
            private int rackclick=0;
            private int pisoActual=0;

            private boolean clic = false;
            private Point puntoCentrado= new Point();

	    private Point ubic = new Point(-1,-1);
            private int idub= -1;
            private ArrayList<Point> secs= new ArrayList<Point>();
            ArrayList<beUbicacion> ubicaciones = new ArrayList<beUbicacion>();
            private ArrayList<String> estadosXY= new ArrayList<String>();
	    private ArrayList racks_escogidos = new ArrayList<Point>();
            private ArrayList<beRack> racks=new ArrayList<beRack>();
            private ArrayList<beUbicacion> ubicsDisponibles=new ArrayList<beUbicacion>(); //Ubicaciones no bloqueadas ni llenas
            private ArrayList<beUbicacion> ubicsBloqueadas=new ArrayList<beUbicacion>(); //Ubicaciones bloqueadas
            private beUbicacion ubicSeleccionada= null; //Ubicacion seleccionada con un clic
	    private char[][] matriz;
            //private boolean eligio_entrada=false;
            private BufferStrategy bfs=null;
            private ArrayList entradas=new ArrayList<beEntrada>();
            private beAlmacen alma=new beAlmacen();


            private beCoordenada ubBloq= new beCoordenada();
            private String estBloq= "";
            private Dimension dimvent;

    /** Creates new form dlgMapaBloqueo */
    public dlgMapaBloqueo(java.awt.Frame parent, boolean modal) {
        super(parent, modal);
        initComponents();
        blAlmacen bla= new blAlmacen();
        blHelper blh= new blHelper();
        blRack blr= new blRack();
        try {
            alma=blh.obtenerDatosAlmacen();
            if (alma.getNombre()!=null){
                entradas = bla.buscarObjsEntrada();
                this.ubicsDisponibles=(new blUbicacion().dameTodasLasUbicacionesDisponibles());
                this.ubicsBloqueadas=(new blUbicacion().dameTodasLasUbicacionesBloqueadas());
                llenarComboPiso();
            }


        } catch (Exception ex) {
            ex.printStackTrace();
            visualHelper.mostrarMensajeError("Ocurrió un error durante el proceso");
        }

        racksXCol= alma.getFilas();
        racksXFila=alma.getRacksXFila();
        tamRack=alma.getUbsxrack();
        pisos=alma.getPisos();
        pnlEstadosUbicacion1.setLocation(puntoCentrado.x-162,puntoCentrado.y+(blh.calcularNumeroFilas(racksXCol)*10)+50);
        pnlEstadosUbicacion1.setVisible(true);
        //this.leerArchivo();


        addMouseListener(new java.awt.event.MouseAdapter() {
            public void mouseClicked(java.awt.event.MouseEvent evt) {
                try {
                    formMouseClicked(evt);
                } catch (Exception ex) {
                    ex.printStackTrace();
                    visualHelper.mostrarMensajeError("Ocurrió un error en el procesamiento");
                }
            }
        });
        

            this.addWindowListener(new WindowListener() {

        public void windowOpened(WindowEvent e) {

        }

        public void windowClosing(WindowEvent e) {

        }

        public void windowClosed(WindowEvent e) {

        }

        public void windowIconified(WindowEvent e) {
        }

        public void windowDeiconified(WindowEvent e) {
        }

        public void windowActivated(WindowEvent e) {

        }

        public void windowDeactivated(WindowEvent e) {
        }
    });

        this.setModal(true);
        
        dimvent=this.getSize();
        puntoCentrado=visualHelper.centrarDibujo(dimvent, blh.calcularNumeroColumnas(racksXFila, tamRack),blh.calcularNumeroFilas(racksXCol) , TAM_UNIT);
        //CALCULAR DE NUEVO EN LA SEGUNDA VENTANA!!!
        visualHelper.centrarDialogoEnPantalla(this);
        this.repaint();

    }

    public beCoordenada getUbBloq() {
        return ubBloq;
    }

    public void setUbBloq(beCoordenada ubBloq) {
        this.ubBloq = ubBloq;
    }

    public String getEstBloq() {
        return estBloq;
    }

    public void setEstBloq(String estBloq) {
        this.estBloq = estBloq;
    }

    public int getIdub() {
        return idub;
    }

    public void setIdub(int idub) {
        this.idub = idub;
    }

    private void llenarComboPiso() throws Exception{
        int maxPiso=0;
        blHelper blh= new blHelper();
        beCoordenada c=new beCoordenada();

        

        maxPiso= new blRack().obtenerRack(1).getCantPiso();
        if(maxPiso>0){
            ArrayList<beCombo> comboPiso = new ArrayList<beCombo>();
            beCombo cmb = new beCombo();
            for (int i = 0; i < maxPiso; i++) {
                cmb = new beCombo();
                cmb.setId_dato(i);
                cmb.setNom_dato(String.valueOf(i+1));
                cmb.setNom_combo("PISORK");
                comboPiso.add(cmb);
            }
            DefaultComboBoxModel mod =blh.ComboBoxItem(comboPiso);
            this.cbxPiso.setModel(mod);
            this.pisoActual=1;
        }
    }

    private ArrayList<beUbicacion> extraerUbicsDeUnPiso(ArrayList<beUbicacion> arr,int p){
        ArrayList<beUbicacion> arr2=new ArrayList<beUbicacion>();
        beCoordenada c=new beCoordenada();

        if((p<=0) || (p>this.cbxPiso.getItemCount())) return null;
        if(arr==null) return null;

        for(int i=0;i<arr.size();i++){
            c=arr.get(i).getCoordenadas();
            if(c.getPiso()==p) arr2.add(arr.get(i));
        }

        return arr2;

    }

    private beUbicacion esCoordUbicacion(int x,int y){
        beCoordenada coord=null;
        for(int i=0;i<this.ubicsDisponibles.size();i++){
            coord=this.ubicsDisponibles.get(i).getCoordenadas();
            if(coord.getxEnMapa()==x && coord.getyEnMapa()==y){
                return this.ubicsDisponibles.get(i);
            }
        }

        for(int i=0;i<this.ubicsBloqueadas.size();i++){
            coord=this.ubicsBloqueadas.get(i).getCoordenadas();
            if(coord.getxEnMapa()==x && coord.getyEnMapa()==y){
                return this.ubicsBloqueadas.get(i);
            }
        }
        return null;


    }



    private void formMouseClicked(java.awt.event.MouseEvent evt) throws Exception {

                int corX=evt.getX();
                int corY=evt.getY();
                blHelper blh = new blHelper();
                int numCol = blh.calcularNumeroColumnas(racksXFila, tamRack);
		int numFil = blh.calcularNumeroFilas(racksXCol);
                Point seccion=new Point();
                beUbicacion ubic=null;
                seccion.x=(corX-puntoCentrado.x)/TAM_UNIT;
                seccion.y=(corY-puntoCentrado.y)/TAM_UNIT;
                
                //rackclick=new blRack().getIdRackByXY(ubic.x,ubic.y);

                    if(corX>=puntoCentrado.x+TAM_UNIT &&corX<(puntoCentrado.x-TAM_UNIT+(numCol*TAM_UNIT)) && corY>=puntoCentrado.y+TAM_UNIT && corY<puntoCentrado.y-TAM_UNIT+(numFil*TAM_UNIT)){
                        ubic=esCoordUbicacion(seccion.x,seccion.y);
                        if (ubic!=null){
                            ubic.getCoordenadas().setPiso(pisoActual);
                            this.ubicSeleccionada=(new blUbicacion().dameUbicacionSegunCoordenadas(seccion.x, seccion.y, pisoActual));                            
                            ubBloq.setFila((new blRack().obtenerRack(ubic.getId_rack())).getNumFila());
                            ubBloq.setRack((new blRack().obtenerRack(ubic.getId_rack())).getNumRack());
                            ubBloq.setUbicacion(ubic.getCoordenadas().getUbicacion());
                            ubBloq.setPiso(pisoActual);
                            idub= new blUbicacion().dameUbicacionSegunCoordenadas(seccion.x, seccion.y, pisoActual).getIdUbicacion();
                            clic= true;                            
                            repaint();
                    }
                 }
            }

            @Override
            public void paint(Graphics g){
                ArrayList<beUbicacion> arrAux=null;
                if (!this.esPrimeraVez){
                    this.esPrimeraVez=true;
                    this.createBufferStrategy(2);
                    bfs =this.getBufferStrategy();
                }
                
                if (getBfs()!=null){
                    Graphics g1=getBfs().getDrawGraphics();
                    super.paint(g1);
                    visualHelper.pintarAlmacen(g1, alma.getFilas(), alma.getRacksXFila(), alma.getUbsxrack(), TAM_UNIT,dimvent);
                    visualHelper.pintarEntradas(g1, entradas, alma.getFilas(), alma.getRacksXFila(), alma.getUbsxrack(), TAM_UNIT,dimvent);

                    if(this.ubicsDisponibles!=null)
                        visualHelper.pintarUbicacionesEspecificandoColor(g1, racksXCol, racksXFila, tamRack, TAM_UNIT, dimvent, extraerUbicsDeUnPiso(this.ubicsDisponibles,pisoActual), Color.GREEN);
                    if(this.ubicsBloqueadas!=null)
                        visualHelper.pintarUbicacionesEspecificandoColor(g1, racksXCol, racksXFila, tamRack, TAM_UNIT, dimvent, extraerUbicsDeUnPiso(this.ubicsBloqueadas,pisoActual), Color.RED);
                    
                    if(this.ubicSeleccionada!=null){
                    arrAux=new ArrayList<beUbicacion>();
                    arrAux.add(ubicSeleccionada);
                    if(this.ubicSeleccionada.getCoordenadas().getPiso()==this.pisoActual)
                        visualHelper.pintarUbicacionesEspecificandoColor(g1,alma.getFilas(), alma.getRacksXFila(), alma.getUbsxrack(),TAM_UNIT,dimvent,arrAux,Color.BLUE);
                }



                    visualHelper.pintarMalla(g1, racksXCol, racksXFila, tamRack, TAM_UNIT,  dimvent);
                    getBfs().show();

                }
            }


            /**
             * @return the bfs
             */
            public BufferStrategy getBfs() {
                return bfs;
            }

            /**
             * @param bfs the bfs to set
             */
            public void setBfs(BufferStrategy bfs) {
                this.bfs = bfs;
            }

    /** This method is called from within the constructor to
     * initialize the form.
     * WARNING: Do NOT modify this code. The content of this method is
     * always regenerated by the Form Editor.
     */
    @SuppressWarnings("unchecked")
    // <editor-fold defaultstate="collapsed" desc="Generated Code">//GEN-BEGIN:initComponents
    private void initComponents() {

        lblNumUbics1 = new javax.swing.JLabel();
        cbxPiso = new javax.swing.JComboBox();
        lblPiso = new javax.swing.JLabel();
        btnGuardar = new javax.swing.JButton();
        pnlEstadosUbicacion1 = new javax.swing.JPanel();
        lblTipoPallet1 = new javax.swing.JLabel();
        lblNoDisponibles = new javax.swing.JLabel();
        lblUbicacionesLibres = new javax.swing.JLabel();
        lblUbicacionesIngresadas = new javax.swing.JLabel();
        pnlRojo = new javax.swing.JPanel();
        pnlVerde = new javax.swing.JPanel();
        pnlAzul = new javax.swing.JPanel();

        setDefaultCloseOperation(javax.swing.WindowConstants.DISPOSE_ON_CLOSE);
        setMinimumSize(new java.awt.Dimension(800, 600));

        lblNumUbics1.setFont(new java.awt.Font("Dialog", 0, 36));
        lblNumUbics1.setText("Bloqueo de ubicaciones");

        cbxPiso.setFont(new java.awt.Font("Dialog", 0, 12));
        cbxPiso.setModel(new javax.swing.DefaultComboBoxModel(new String[] { "Item 1", "Item 2", "Item 3", "Item 4" }));
        cbxPiso.setSelectedItem(null);
        cbxPiso.addActionListener(new java.awt.event.ActionListener() {
            public void actionPerformed(java.awt.event.ActionEvent evt) {
                cbxPisoActionPerformed(evt);
            }
        });

        lblPiso.setFont(new java.awt.Font("Dialog", 0, 12));
        lblPiso.setForeground(new java.awt.Color(0, 0, 0));
        lblPiso.setText("Piso");

        btnGuardar.setBackground(new java.awt.Color(240, 235, 226));
        btnGuardar.setFont(new java.awt.Font("Dialog", 0, 12));
        btnGuardar.setText("Guardar");
        btnGuardar.addActionListener(new java.awt.event.ActionListener() {
            public void actionPerformed(java.awt.event.ActionEvent evt) {
                btnGuardarActionPerformed(evt);
            }
        });

        pnlEstadosUbicacion1.setBorder(javax.swing.BorderFactory.createTitledBorder(javax.swing.BorderFactory.createLineBorder(new java.awt.Color(0, 0, 0)), "Leyenda"));
        pnlEstadosUbicacion1.setLayout(null);

        lblTipoPallet1.setFont(new java.awt.Font("Dialog", 0, 12));
        lblTipoPallet1.setForeground(new java.awt.Color(0, 0, 0));
        lblTipoPallet1.setText("Pallet");
        pnlEstadosUbicacion1.add(lblTipoPallet1);
        lblTipoPallet1.setBounds(340, 380, 80, 15);

        lblNoDisponibles.setFont(new java.awt.Font("Dialog", 0, 12));
        lblNoDisponibles.setForeground(new java.awt.Color(0, 0, 0));
        lblNoDisponibles.setText("Ubicaciones no disponibles");
        pnlEstadosUbicacion1.add(lblNoDisponibles);
        lblNoDisponibles.setBounds(40, 10, 220, 30);

        lblUbicacionesLibres.setFont(new java.awt.Font("Dialog", 0, 12));
        lblUbicacionesLibres.setForeground(new java.awt.Color(0, 0, 0));
        lblUbicacionesLibres.setText("Ubicaciones libres");
        pnlEstadosUbicacion1.add(lblUbicacionesLibres);
        lblUbicacionesLibres.setBounds(40, 30, 220, 30);

        lblUbicacionesIngresadas.setFont(new java.awt.Font("Dialog", 0, 12));
        lblUbicacionesIngresadas.setForeground(new java.awt.Color(0, 0, 0));
        lblUbicacionesIngresadas.setText("Ubicaciones bloqueadas");
        pnlEstadosUbicacion1.add(lblUbicacionesIngresadas);
        lblUbicacionesIngresadas.setBounds(40, 50, 220, 30);

        pnlRojo.setBackground(java.awt.Color.red);
        pnlRojo.setBorder(javax.swing.BorderFactory.createLineBorder(new java.awt.Color(0, 0, 0)));
        pnlEstadosUbicacion1.add(pnlRojo);
        pnlRojo.setBounds(20, 60, 12, 12);

        pnlVerde.setBackground(java.awt.Color.green);
        pnlVerde.setBorder(javax.swing.BorderFactory.createLineBorder(new java.awt.Color(0, 0, 0)));
        pnlEstadosUbicacion1.add(pnlVerde);
        pnlVerde.setBounds(20, 40, 12, 12);

        pnlAzul.setBackground(java.awt.Color.blue);
        pnlAzul.setBorder(javax.swing.BorderFactory.createLineBorder(new java.awt.Color(0, 0, 0)));
        pnlEstadosUbicacion1.add(pnlAzul);
        pnlAzul.setBounds(20, 20, 12, 12);

        javax.swing.GroupLayout layout = new javax.swing.GroupLayout(getContentPane());
        getContentPane().setLayout(layout);
        layout.setHorizontalGroup(
            layout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING)
            .addGroup(layout.createSequentialGroup()
                .addContainerGap(175, Short.MAX_VALUE)
                .addGroup(layout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING)
                    .addGroup(javax.swing.GroupLayout.Alignment.TRAILING, layout.createSequentialGroup()
                        .addComponent(pnlEstadosUbicacion1, javax.swing.GroupLayout.PREFERRED_SIZE, 280, javax.swing.GroupLayout.PREFERRED_SIZE)
                        .addGap(72, 72, 72)
                        .addComponent(btnGuardar, javax.swing.GroupLayout.PREFERRED_SIZE, 160, javax.swing.GroupLayout.PREFERRED_SIZE)
                        .addGap(41, 41, 41))
                    .addGroup(javax.swing.GroupLayout.Alignment.TRAILING, layout.createSequentialGroup()
                        .addComponent(lblPiso, javax.swing.GroupLayout.PREFERRED_SIZE, 43, javax.swing.GroupLayout.PREFERRED_SIZE)
                        .addPreferredGap(javax.swing.LayoutStyle.ComponentPlacement.RELATED)
                        .addComponent(cbxPiso, javax.swing.GroupLayout.PREFERRED_SIZE, 70, javax.swing.GroupLayout.PREFERRED_SIZE)
                        .addGap(51, 51, 51))
                    .addGroup(javax.swing.GroupLayout.Alignment.TRAILING, layout.createSequentialGroup()
                        .addComponent(lblNumUbics1, javax.swing.GroupLayout.PREFERRED_SIZE, 460, javax.swing.GroupLayout.PREFERRED_SIZE)
                        .addGap(164, 164, 164))))
        );
        layout.setVerticalGroup(
            layout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING)
            .addGroup(layout.createSequentialGroup()
                .addGap(24, 24, 24)
                .addComponent(lblNumUbics1)
                .addGap(18, 18, 18)
                .addGroup(layout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING)
                    .addGroup(layout.createSequentialGroup()
                        .addGroup(layout.createParallelGroup(javax.swing.GroupLayout.Alignment.BASELINE)
                            .addComponent(cbxPiso, javax.swing.GroupLayout.PREFERRED_SIZE, javax.swing.GroupLayout.DEFAULT_SIZE, javax.swing.GroupLayout.PREFERRED_SIZE)
                            .addComponent(lblPiso))
                        .addContainerGap())
                    .addGroup(layout.createSequentialGroup()
                        .addGap(15, 15, 15)
                        .addGroup(layout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING)
                            .addGroup(layout.createSequentialGroup()
                                .addGap(431, 431, 431)
                                .addComponent(btnGuardar)
                                .addGap(13, 13, 13))
                            .addGroup(javax.swing.GroupLayout.Alignment.TRAILING, layout.createSequentialGroup()
                                .addPreferredGap(javax.swing.LayoutStyle.ComponentPlacement.RELATED, javax.swing.GroupLayout.DEFAULT_SIZE, Short.MAX_VALUE)
                                .addComponent(pnlEstadosUbicacion1, javax.swing.GroupLayout.PREFERRED_SIZE, 80, javax.swing.GroupLayout.PREFERRED_SIZE)))
                        .addGap(28, 28, 28))))
        );

        pack();
    }// </editor-fold>//GEN-END:initComponents

    private void cbxPisoActionPerformed(java.awt.event.ActionEvent evt) {//GEN-FIRST:event_cbxPisoActionPerformed
        this.pisoActual=this.cbxPiso.getSelectedIndex()+1;
        ubicSeleccionada=null;
        repaint();
}//GEN-LAST:event_cbxPisoActionPerformed

    private void btnGuardarActionPerformed(java.awt.event.ActionEvent evt) {//GEN-FIRST:event_btnGuardarActionPerformed

            if(this.ubicSeleccionada!=null) {
            try {
                estBloq = new blUbicacion().dameEstado(idub);
            } catch (SQLException ex) {
                visualHelper.mostrarMensajeError("Error en el procesamiento");
                ex.printStackTrace();
            }
                this.setVisible(false);
            }else{
                visualHelper.mostrarMensajeAdvertencia("Elija un ubicación para bloquear desbloquear");
                return;
            }
    }//GEN-LAST:event_btnGuardarActionPerformed



    // Variables declaration - do not modify//GEN-BEGIN:variables
    private javax.swing.JButton btnGuardar;
    private javax.swing.JComboBox cbxPiso;
    private javax.swing.JLabel lblNoDisponibles;
    private javax.swing.JLabel lblNumUbics1;
    private javax.swing.JLabel lblPiso;
    private javax.swing.JLabel lblTipoPallet1;
    private javax.swing.JLabel lblUbicacionesIngresadas;
    private javax.swing.JLabel lblUbicacionesLibres;
    private javax.swing.JPanel pnlAzul;
    private javax.swing.JPanel pnlEstadosUbicacion1;
    private javax.swing.JPanel pnlRojo;
    private javax.swing.JPanel pnlVerde;
    // End of variables declaration//GEN-END:variables

}
